/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

package fr.loof.fonzie.dialects;

import org.apache.openjpa.util.Proxies;
import org.apache.openjpa.util.Proxy;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Experimental support for OpenJPA
 * 
 * @author <a href="nicolas@apache.org">Nicolas De Loof</a>
 */
public class OpenJPADialect
    extends JPADialectSupport
{
    protected static Logger logger = LoggerFactory.getLogger( OpenJPADialect.class );

    public Object getIdentifier( Object entity )
    {
        if ( isProxy( entity ) )
        {
            Proxy proxy = (Proxy) entity;
            entity = Proxies.writeReplace( proxy, true );
        }
        return readIdentifier( entity );
    }

    public Class getActualType( Object entity )
    {
        if ( isProxy( entity ) )
        {
            Proxy proxy = (Proxy) entity;
            // FIXME better way ?
            return Proxies.writeReplace( proxy, true ).getClass();
        }
        return entity.getClass();
    }

    @SuppressWarnings( "unchecked" )
    public <T> T getImplementation( T entity )
    {
        if ( isProxy( entity ) )
        {
            Proxy proxy = (Proxy) entity;
            return (T) Proxies.writeReplace( proxy, true );
        }
        return entity;
    }

    public boolean isProxy( Object entity )
    {
        logger.debug( "entity {} is an OpenJPA Proxy", entity );
        return ( entity instanceof Proxy );
    }
}
